package com.guiguli.lambdaDemo;

public class lambdaDemo1 {
    interface Printer{//成员位置创建一个接口
        void printer(String val);
    }

    public void pringSomething(String something,Printer printer){
        printer.printer(something);
    }

    public void print(Printer printer){

    }

    public static void main(String[] args) {
        lambdaDemo1 LambdaDemo1 = new lambdaDemo1();
        String some = "abcdefG";
        Printer printer = new Printer() {//匿名内部类，实现接口，参考com.guiguli.InnerClassDemo6
            @Override
            public void printer(String val) {
                System.out.println(val);
            }
        };
        LambdaDemo1.pringSomething(some,printer);

        //以上是使用原来的方式，而非lambda，下面则使用lambda
//        Printer printer2 = (String val)->{
//            System.out.println(val);
//        };

        //我们还可以简化不写类型
//        Printer printer2 = (val)->{
//            System.out.println(val);
//        };

        //当只有一个参数的时候可以不需要括号
//        Printer printer2 = val->{
//            System.out.println(val);
//        };

        //当只有一行的时候，大括号也可以不需要
        //Printer printer2 = val -> System.out.println(val);

        //我们使用的时候只需要像下面这样
        LambdaDemo1.pringSomething(some,val-> System.out.println(val));

        //当我们没有任何参数的时候,可以这样写
        //() -> System.out.println("666666");

        //强调:lambda表达式会根据上下文推断lambda表达式的参数和返回值类型

        //说一个题外话，方法引用，什么意思呢?我们可以像下面这样写，因为库函数println的形参和返回值完全符合我们接口，所以也能这样使用
        LambdaDemo1.pringSomething(some, System.out::println);
    }
}
